<?php
class widgetsAgenda{
	
	/**
	 * Visualisation du widget Agenda dans la sidebar ...
	 *
	 * @param dcWidgets $w le widget
	 * @return String le code a insérer
	 */
	public static function showAgenda(&$w)
	{
		global $core;
		
		if ($w->homeonly && $core->url->type != 'default') {
			return;
		}
		$agenda = new dcAgendaPlugin($core);
		$title = $w->title ? html::escapeHTML($w->title) : __('Agenda Plugin');
		$params['post_type'] = 'agenda';
		$params['order'] = "date_debut ".$w->ordre;
		if ($w->nb_events != '*' && $w->nb_events != ''){
			$params['limit'] = $w->nb_events;
		}
		if ($w->only_future)
		{
			$params['sql'] = 'AND date_debut >= "'.date('Y-m-d H:i:s').'" ';
			
		}
		$rs = $agenda->getPosts($params);
		
		// Si il n'y a pas d'evenements on affiche juste le titre
		if ($rs->isEmpty())
		{
			$res =
				'<div id="agenda">'.
				'<h2>'.$title.'</h2>';
			$res .= '</div>';
			return $res;
		}
		
		if($w->type_affichage == 0){
			$res =
			'<div id="agenda">'.
			'<h2>'.$title.'</h2>'.
			'<ul>';
			// je dois recuperer la liste des entrees en fonction des options
			// saisies dans la configuration du widget
			$date_format = str_replace('%', '', $w->date_format);
			while($rs->fetch()) {
			  $res .= '<li><a href="'.$rs->getURL().'"><span class="agenda-list-date">'.date($date_format, strtotime($rs->date_debut)).'</span> - '.html::escapeHTML($rs->post_title).'</a></li>';
			}
	
			$res .= '</ul>';
			if($w->flux != 0)
			{
				$flux = 'rss2';
				if ($w->flux == 2){
					$flux = 'atom';
				}
				$res .= '<div class="syndicate">';
				$res .= '<ul>';
				$res .= '<li>';
				$res .= '<a href="'.$core->blog->url.'Agenda/feed/'.$flux.'" class="feed">'.__('Agenda feed links')."</a>";
				$res .= '</li>';
				$res .= '</ul>';
				$res .= '</div>';
			}
			$res .= '</div>';
		}else{
			// Je dois construire le calendrier avec les evenements
			// Peut etre un tooltip
			
			
			$res =
			'<div id="agenda" class="calendar">'.
			'<h2>'.$title.'</h2>';
			$res .= self::_constructAgenda($rs);
			$res .= '<br />';
			if($w->flux != 0)
			{
				// On ajoute le lien alternate ...
				
				$flux = 'rss2';
				if ($w->flux == 2){
					$flux = 'atom';
					$core->addBehavior('publicHeadContent', array('agendaBehaviors', 'AtomLink'));
				}else{
					$core->addBehavior('publicHeadContent', array('agendaBehaviors', 'Rss2Link'));
				}
				$res .= '<div class="syndicate">';
				$res .= '<ul>';
				$res .= '<li>';
				$res .= '<a href="'.$core->blog->url.'Agenda/feed/'.$flux.'" class="feed">'.__('Agenda feed links')."</a>";
				$res .= '</li>';
				$res .= '</ul>';
				$res .= '</div>';
			}
			$res .= '</div>';
			
		}
		return $res;
	}
	
	/**
	 * Initialisation du widget 
	 *
	 * @param dcWidgets $w
	 */
	public static function init(&$w)
	{
	    $w->create('Agenda',__('Agenda Plugin'),array('widgetsAgenda','showAgenda'));
	    $w->Agenda->setting('title',__('Title:'),'');
	    $w->Agenda->setting('type_affichage', __('View type : '),null, 'combo', array(
	    		'liste' => 0,
			'calendrier'=>1	));
	    $w->Agenda->setting('only_future', __('Afficher uniquement les evenements futurs'), 0, 'check');
	    $w->Agenda->setting('nb_events', __('Event number (uniquement pour l\'affichage en liste) : '),'*', 'text');
            //$w->Agenda->setting('group',__('grouper les evenements par date'),0,'check');
	    $w->Agenda->setting('ordre', __('Event Order (uniquement pour l\'affichage en liste) :'), null, 'combo', array(
	    			'Croissant' => 'ASC', 
				'D&eacute;croissant' => 'DESC'
	    		));
	    $w->Agenda->setting('date_format', __('Event date format (uniquement pour l\'affichage en liste)(php date) :'),'%d-%m-%Y', 'text'); 
	    $w->Agenda->setting('homeonly',__('Home page only'),0,'check');
	    
	    // Gestion des flux RSS / ATOM
	    $w->Agenda->setting('flux', __('Show feeds links'), null, 'combo', array(
	    	'Aucun' => 0,
	    	'rss2' => 1, 
	    	'atom' => 2
	    ));
	    
	    
	}
	public static function navigation(&$w)
	{
		$w->create('navigation', __('Navigation links'), array('widgetsAgenda', 'showNavigation'));
	}

	
	/**
	 * Surcharge de la focntion de l'objet class.dc.templates.php
	 * Permet de rajouter Agenda dans le bandeau de navigation
	 * 
	 * @see dcTemplate
	 * @param dcWidgets $w le widget
	 * @return String le code pour le template
	 */
	public static function showNavigation(&$w){
		global $core;
	        $res =
		        '<div id="topnav">'.
			'<ul>';
		if ($core->url->type != 'default') {
			$res .=
			'<li class="topnav-home">'.
			'<a href="'.$core->blog->url.'">'.__('Home').'</a>'.
			'<span> - </span></li>';
		}
		 if ($core->url->type != 'Agenda'){
                         $res .= '<li class="topnav-agenda">'.
		             '<a href="'.$core->blog->url.$core->url->getBase("Agenda").'">'.__('Agenda').'</a>'.
			     '<span> - </span></li>';
		}
		$res .=
			'<li class="topnav-arch">'.
				'<a href="'.$core->blog->url.$core->url->getBase("archive").'">'.
				__('Archives').'</a></li>';
	        $res .=  '</ul>'.
				'</div>';
		return $res;
	}
	
	
	/**
	 * Permet de construire l'agenda
	 *
	 * @param rsExtPost $rs
	 * @param timstamp
	 * @return String 
	 */
	public static function _constructAgenda($rs, $date_du_jour=0){
		if ($date_du_jour == 0)
			$date_du_jour = time();
		
		
		
			
			
		// Je dois récupérer toutes les dates avec evenements ...
		$dates = array();
		while ($rs->fetch())
		{
			//$nb_days = date('d', strtotime($rs->date_fin)) - date('d', strtotime($rs->date_debut));
			
			$da = strtotime($rs->date_debut);
			while($da <= strtotime($rs->date_fin)){
				array_push($dates, date('Y-m-d', $da));
				$da = $da+(24*3600);
			}
		}
		//print_r($dates);
		//exit;
	// Nombre de jours de chaques mois
		// Tient compte des années bisextiles
		$a = date('Y', $date_du_jour);
		$m = date('n', $date_du_jour);
		if (($a % 4) == 0){
			$nbrjour = array(0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
 		}else{
 			$nbrjour = array(0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
		}
		

		// On cherche grâce à cette fonction à quel jour de la semaine correspond le 1er du mois
		$premierdumois = jddayofweek(cal_to_jd($CAL_FRENCH, $m, 1, $a), 0);
		if($premierdumois == 0){
			$premierdumois = 7;
		}

		
		$jour=1; //Cette variable est celle qui va afficher les jours de la semaine
		$joursmoisavant = $nbrjour[$m-1] - $premierdumois+2; //Celle-ci sert à afficher les jours du mois précédent qui apparaissent
		$mois_avant = $m-1;
		$mois_suivant = $m+1;
		
		$annee_suivante = date('Y', $date_du_jour);
		$annee_precedente = date('Y', $date_du_jour);
		
		
		$jourmoissuivant = 1; //Et celle-ci les jours du mois suivant
		if($m == 1){
			$joursmoisavant = $nbrjour[$m+11] - $premierdumois+2; //Si c'est janvier, le mois d'avant n'est pas à 0 mais 31 jours!
		}
		$annee_suivante = date('Y', $date_du_jour);
		if ($mois_avant == 0){
			$annee_precedente = $annee_precedente-1;
			$mois_avant = 12;
			$joursmoisavant = $nbrjour[12] - $premierdumois+2; //Si c'est janvier, le mois d'avant n'est pas à 0 mais 31 jours!
		}
		
		if ($mois_suivant == 13)
		{
			$annee_suivante = $annee_suivante+1;
			$mois_suivant = 1;
			
		}
		
		
		
		
		$res = '<table border="1" align="center">';
		// entete de l'agenda
		$res .= '<tr>';
		$res .= "<td class='agendalink previous'><a href='".self::constructUrl(0, $mois_avant,$annee_precedente, true)."' id='agendapreviousmonth' nohref=''><<</a> </td>";
		$res .= "<td colspan='5' align='center' class='agendamois' ><a href='".self::constructUrl(0, date('m', $date_du_jour),date('Y', $date_du_jour))."' >".__(date('F', $date_du_jour)).' '.date('Y', $date_du_jour)."</a></td>";
		$res .= "<td class='agendalink next'><a href='".self::constructUrl(0, $mois_suivant,$annee_suivante, true)."' id='agendanextmonth' nohref=''>>></a></td>";
		$res .= '</tr>';
		// Les jours
		$res .= '<tr class="agendajours">';
		$res .= '<td>'.__('_Mon').'</td>';
		$res .= '<td>'.__('_Tue').'</td>';
		$res .= '<td>'.__('_Wed').'</td>';
		$res .= '<td>'.__('_Thu').'</td>';
		$res .= '<td>'.__('_Fri').'</td>';
		$res .= '<td>'.__('_Sat').'</td>';
		$res .= '<td>'.__('_Sun').'</td>';
		$res .= '</tr>';
		
		
		
		global $core;
		
		//Et c'est parti pour la boucle for qui va créer l'affichage de notre calendrier !
		for($i=1;$i<40;$i++){
			if($i < $premierdumois){ // Tant que la variable i ne correspond pas au premier jour du mois, on fait des cellules de tableau avec les derniers jours du mois précédent
				$test = date('Y-m-d', mktime(0, 0, 0, $mois_avant, $joursmoisavant, $annee_precedente));
				//echo $test;
				if (in_array($test, $dates)){
					$res .= "<td class=\"cases_vides\"><strong><a href=\"".$core->blog->url."Agenda/".date('Y/m/d', mktime(0, 0, 0, $mois_avant, $joursmoisavant, $annee_precedente))."\">$joursmoisavant</a></strong></td>";
					
				}else{
					$res .= "<td class=\"cases_vides\">$joursmoisavant</td>";
				}
				$joursmoisavant++;
			}else{
				if($jour == date("d") && $m == date("n")){ //Si la variable $jour correspond à la date d'aujourd'hui, la case est d'une couleur différente
					$test = date('Y-m-d', mktime(0, 0, 0, date('n', $date_du_jour), $jour, date('Y', $date_du_jour)));
					if (in_array($test, $dates)){
						$res .="<td class=\"aujourdhui\"><strong><a href=\"".$core->blog->url."Agenda/".date('Y/m/d', mktime(0, 0, 0, date('n', $date_du_jour), $jour, date('Y', $date_du_jour)))."\">$jour</a></strong></td>";
					}else{
						$res .="<td class=\"aujourdhui\">$jour</td>";
					}
				}else{
					$test = date('Y-m-d', mktime(0, 0, 0, date('n', $date_du_jour), $jour, date('Y', $date_du_jour)));
					if (in_array($test, $dates)){
						$res .= "<td class=\"jours\"><strong><a href=\"".$core->blog->url."Agenda/".date('Y/m/d', mktime(0, 0, 0, date('n', $date_du_jour), $jour, date('Y', $date_du_jour)))."\">$jour</a></strong></td>";
					}else{
						$res .= "<td class=\"jours\">$jour</td>";
					}
				}
				$jour++; //On passe au lendemain ^^
		
		 /*Si la variable $jour est plus élevée que le nombre de jours du mois, c'est que c'est la fin du mois!
		 On remplit les cases vides avec les premiers jours des mois suivants
		 Hop on ferme le tableau,
		 et on met la variable $i à 41 pour sortir de la boucle */
		 		if($jour > ($nbrjour[$m])){
		 			while($i % 7 != 0){
		 				$test = date('Y-m-d', mktime(0, 0, 0, $mois_suivant, $jourmoissuivant, $annee_suivante));
						if (in_array($test, $dates)){
			 				$res .= "<td class=\"cases_vides\"><strong><a href=\"".$core->blog->url."Agenda/".date('Y/m/d', mktime(0, 0, 0, date('n', $date_du_jour), $jour, date('Y', $date_du_jour)))."\">$jourmoissuivant</a></strong></td>";
						}else{
							$res .= "<td class=\"cases_vides\">$jourmoissuivant</td>";
						}
		 				$i++;
		 				$jourmoissuivant++;
		 			}
			 		$res .= "</tr></table>";
			 		$i=41;
		 		}
		 	}
		
		 // Si la variable i correspond à un dimanche (multiple de 7), on passe à la ligne suivante dans le tableau
			if($i % 7 == 0){
				$res .= "</tr><tr>";
			}
	 	} 
		
		return $res;
	}
	
	/**
	 * Construiit l'url de l'agenda
	 *
	 * @param Integer $jour le jour du mois
	 * @param Integer $mois le mois
	 * @param Integer $annee l'annee
	 * @param bool $ajax
	 * @return url
	 */
	public static function constructUrl($jour, $mois, $annee, $ajax=false){
		global $core;
		if ($ajax){
			$base = "AgendaAjax";
		}else{
			$base = "Agenda";
		}
		$url = 'tt';
		if ($jour == 0)
		{
			if (strlen($mois) == 1){
				$mois = '0'.$mois;
			}
			$url = "$base/$annee/$mois/";
		}
		if ($mois == 0)
			$url = "$base/$annee/";
		if ($annee == 0)
			$url = "$base/";
		if ($jour != 0 && $annee != 0 && $mois != 0)
		{
			if (strlen($jour) == 1){
				$jour = '0'.$jour;
			}
			$url = "$base/$annee/$mois/$jour";
		}	
		return $core->blog->url.$url;	
	}

	

}
?>